package com.jprocms.module.cms.dal.mysql.investigateitemoption;

import com.jpro.framework.common.pojo.PageResult;
import com.jpro.framework.mybatis.core.mapper.BaseMapperX;
import com.jpro.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.jprocms.module.cms.controller.admin.investigateitemoption.vo.InvestigateItemOptionListReqVO;
import com.jprocms.module.cms.controller.admin.investigateitemoption.vo.InvestigateItemOptionPageReqVO;
import com.jprocms.module.cms.dal.dataobject.investigateitemoption.InvestigateItemOptionDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.lang.Nullable;

import java.util.List;

/**
 * 问卷调查条目选项 Mapper
 *
 * @author jprocms
 */
@Mapper
public interface InvestigateItemOptionMapper extends BaseMapperX<InvestigateItemOptionDO> {

    /**
     * 根据调查问卷条目ID获取列表
     *
     * @param itemId 调查问卷条目ID
     * @return 数据列表
     */
    List<InvestigateItemOptionDO> selectByItemId(Long itemId);

    /**
     * 根据主键获取数据
     *
     * @param id 主键ID
     * @return 实体对象。没有找到数据，则返回 {@code null}
     */
    @Nullable
    InvestigateItemOptionDO select(Long id);

    /**
     * 投票
     *
     * @param itemId    调查问卷条目ID
     * @param optionIds 调查问卷选项ID列表
     * @return 更新条数
     */
    int vote(@Param("itemId") Long itemId, @Param("optionIds") List<Long> optionIds);

    /**
     * 根据站点ID删除数据
     *
     * @param siteId 站点ID
     * @return 被删除的数据条数
     */
    int deleteBySiteId(Long siteId);

    /**
     * 删除属于某调查问卷ID，且不属于itemIds的调查问卷选项数据
     *
     * @param investigateId 调查问卷ID
     * @param itemIds       不包含的调查条目id列表
     * @return 被删除的数据条数
     */
    int deleteByInvestigateId(@Param("investigateId") Long investigateId, @Param("itemIds") List<Long> itemIds);

    /**
     * 删删除属于某调查问卷条目ID，且不包含的相应调查问卷选项id列表的数据
     *
     * @param itemId 调查问卷条目ID
     * @param ids    不包含的调查选项id列表
     * @return 被删除的数据条数
     */
    int deleteByItemId(@Param("itemId") Long itemId, @Param("ids") List<Long> ids);

    default PageResult<InvestigateItemOptionDO> selectPage(InvestigateItemOptionPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<InvestigateItemOptionDO>()
                .eqIfPresent(InvestigateItemOptionDO::getSiteId, reqVO.getSiteId())
                .eqIfPresent(InvestigateItemOptionDO::getInvestigateId, reqVO.getInvestigateId())
                .eqIfPresent(InvestigateItemOptionDO::getInvestigateItemId, reqVO.getInvestigateItemId())
                .eqIfPresent(InvestigateItemOptionDO::getTitle, reqVO.getTitle())
                .betweenIfPresent(InvestigateItemOptionDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(InvestigateItemOptionDO::getId));
    }

    default List<InvestigateItemOptionDO> selectList(InvestigateItemOptionListReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<InvestigateItemOptionDO>()
                .eqIfPresent(InvestigateItemOptionDO::getSiteId, reqVO.getSiteId())
                .eqIfPresent(InvestigateItemOptionDO::getInvestigateId, reqVO.getInvestigateId())
                .eqIfPresent(InvestigateItemOptionDO::getInvestigateItemId, reqVO.getInvestigateItemId())
                .eqIfPresent(InvestigateItemOptionDO::getTitle, reqVO.getTitle())
                .betweenIfPresent(InvestigateItemOptionDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(InvestigateItemOptionDO::getId));
    }

}
